package main

import "fmt"

// 数组的定义方式：
// 1. 先定义长度，再赋值
// 2.直接赋值
// 3.循环可以用fori 也可以用for range
// 第一个元素的地址 -就是数组的首地址:
// 数组默认值:
// 数组是值传递:
func main() {
	//定义和赋值~
	defineAndAssign()

	//第一个元素的地址 -就是数组的首地址
	firstElementPtr()

	//遍历数组
	iterateArray()

	//数组默认值
	arrayDefaultValue()

	//数组是值传递
	arrayValueCopy()

}

// 定义和赋值~【必须定义长度】
// 1. 先定义长度，再赋值
// 2.直接赋值
func defineAndAssign() {
	fmt.Println("-------------定义和赋值-------------")
	var a1 [4]string
	fmt.Println("a1尚未赋值：", a1) //a1尚未赋值： [   ]
	a1[0] = "AAA-0"
	a1[1] = "AAA-1"
	a1[2] = "AAA-2"
	a1[3] = "AAA-3"
	fmt.Println("a1赋值后：", a1) //a1赋值后： [AAA-0 AAA-1 AAA-2 AAA-3]

	var a2 [5]byte
	fmt.Println("a2尚未赋值：", a2) //a2尚未赋值： [0 0 0 0 0]
	a2[3] = 100
	fmt.Println("a2赋值后：", a2) //a2赋值后： [0 0 0 100 0]

	var c1 [4]string = [...]string{"A", "B", "C", "D"}
	//fori循环
	for i := 0; i < len(c1); i++ {
		fmt.Printf("%d %v \n", i, c1[i])
	}
	//for range循环
	for index, value := range c1 {
		fmt.Printf("%d %v \n", index, value)
	}

}

// 第一个元素的地址 -就是数组的首地址
func firstElementPtr() {
	fmt.Println("-------------第一个元素的地址 -就是数组的首地址-------------")
	var arr [10]int
	for i := 0; i < 10; i++ {
		arr[i] = i + 1
	}
	fmt.Printf("%T %v %d \n", arr, arr, len(arr))
	fmt.Printf("第一个元素的地址 %p 就是数组的首地址 %p\n", &arr, &arr[0])
	//第一个元素的地址 0xc000016550 就是数组的首地址 0xc000016550 两个地址相同

}

// 遍历数组：fori forr
func iterateArray() {
	fmt.Println("-------------遍历数组-------------")
	var arr01 = [5]float64{5.0, 7.0, 8.8, 9.4, 4.0}
	for i := 0; i < len(arr01); i++ {
		fmt.Printf("%f \n", arr01[i])
	}
	for index, value := range arr01 {
		fmt.Printf("index=%d  value=%f \n", index, value)
	}

	for _, v := range arr01 {
		fmt.Printf("value=%f \n", v)
	}

	var arr = [...]string{"张三", "李四", "王五", "赵六"}
	for i := 0; i < len(arr); i++ {
		fmt.Printf("index=%d  value=%s \n", i, arr[i])
	}

	for i, v := range arr {
		fmt.Printf("index=%d  value=%s \n", i, v)
	}

}

// 数组默认值
func arrayDefaultValue() {
	fmt.Println("-------------数组默认值-------------")
	var arr1 [3]int
	for i, v := range arr1 {
		fmt.Printf("index=%d  value=%v \n", i, v)
	}
	var arr2 [3]string

	for i, v := range arr2 {
		fmt.Printf("index=%d  value=%v \n", i, v)
	}

}

// 数组是值传递：【基本数据类型：int系列 、float系列  bool byte string 、数组  和  struct】
func arrayValueCopy() {
	fmt.Println("-------------数组是值传递-------------")
	//长度一定要写
	var arr = [3]int{11, 22, 33}
	//对arr进行值拷贝~
	test01(arr)
	fmt.Println(arr) //[11 22 33]

	fmt.Println()
	//传递的地址
	test02(&arr)
	fmt.Println(arr) //[100 22 33]

}

// 对arr进行值拷贝~
func test01(arr [3]int) {
	arr[0] = 100
	fmt.Println(arr) //[100 22 33]
}

// 传递的地址
func test02(arr *[3]int) {
	(*arr)[0] = 100
	fmt.Println(*arr) //[100 22 33]

}
